"""模型评估在统计学和机器学习中具有至关重要，它帮助我们主要目标是量化模型预测新数据的能力。

在这个数据充斥的时代，没有评估的模型就如同盲人摸象，可能带来误导和误判。
模型评估不仅是一种方法，更是一种保障，确保我们在数据海洋中航行时，能够依赖准确的模型，做出明智的决策。

本篇主要介绍模型评估时，如何利用scikit-learn帮助我们快速进行各种误差的分析。

1. 平均绝对误差
平均绝对误差（Mean Absolute Error，简称MAE），它用于度量预测值与真实值之间的平均误差大小。
它能直观地反映出预测的准确性，MAE越小，说明模型的预测能力越好。

1.1. 计算公式
平均绝对误差的计算公式如下：
MAE(y,^y)=1/n∑i=0n−1|yi−^yi|.其中，n是样本数量，yi是真实值，^yi是预测值。
1.2. 使用示例"""
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_squared_log_error
from sklearn.metrics import mean_absolute_percentage_error
from sklearn.metrics import median_absolute_error
from sklearn.metrics import max_error
import numpy as np

# 随机生成100个sample
n = 100
y_true = np.random.randint(1, 100, n)
y_pred = np.random.randint(1, 100, n)

mean_absolute_error(y_true, y_pred)
"""mean_absolute_error就是scikit-learn中用来计算MAE的函数。

2. 均方误差
均方误差（Mean Squared Error，简称MSE），它用于衡量模型的预测值与实际观测值之间的差异。
MSE越小，表示模型的预测值与实际观测值之间的差异较小，即模型具有较高的预测精度。

2.1. 计算公式
MSE(y,^y)=1/n∑i=0n−1(yi−^yi)2.其中，n是样本数量，yi是真实值，^yi是预测值。
2.2. 使用示例"""

n = 100
y_true = np.random.randint(1, 100, n)
y_pred = np.random.randint(1, 100, n)

mean_squared_error(y_true, y_pred)
"""mean_squared_error就是scikit-learn中用来计算MSE的函数。

3. 均方对数误差
均方对数误差（Mean Squared Log Error，简称MSLE），与均方误差（MSE）相比，MSLE在计算误差时先对预测值和真实值取对数。
通过对数转换，MSLE能够减小较大值和较小值之间的差异，使得误差度量更为稳定。
MSLE的值越小，表示预测结果与真实值的差异越小，即模型的拟合程度越好。

3.1. 计算公式
MSLE(y,^y)=1/n∑i=0n−1(loge(1+yi)−loge(1+^yi))2.其中，n是样本数量，yi是真实值，^yi是预测值。
3.2. 使用示例"""

n = 100
y_true = np.random.randint(1, 100, n)
y_pred = np.random.randint(1, 100, n)

mean_squared_log_error(y_true, y_pred)
"""mean_squared_log_error就是scikit-learn中用来计算MSLE的函数。

4. 平均绝对百分比误差
平均绝对百分比误差（Mean Absolute Percentage Error，简称MAPE），平均绝对误差（MAE）相比，MAPE将误差转化为百分比形式，这使得它在不同尺度的数据上具有更好的可比性。
MAPE越小，表示模型的预测结果与实际结果的差异较小，即模型的预测准确性较高。

4.1. 计算公式
MAPE(y,^y)=1/n∑i=0n−1|yi−^yi|max(ϵ,|yi|)其中，n是样本数量，yi是真实值，^yi是预测值。ϵ是一个任意小但严格为正的数，
以避免在yi为零时出现未定义的结果。4.2. 使用示例"""

n = 100
y_true = np.random.randint(1, 100, n)
y_pred = np.random.randint(1, 100, n)

mean_absolute_percentage_error(y_true, y_pred)
"""mean_absolute_percentage_error就是scikit-learn中用来计算MAPE的函数。

5. 绝对误差中值
绝对误差中值（Median Absolute Error，简称MedAE），它用于衡量预测模型对于数据集的精度。
与平均误差相比，中值对异常值更为稳健，对于数据集中的异常值和离群点，绝对误差中值具有较强的抗性。
MedAE越小的模型，通常意味着它在大多数数据点上的预测更为准确。

5.1. 计算公式
MedAE(y,^y)=median(∣y1−^y1∣,…,∣yn−^yn∣).其中，yi是真实值，^yi是预测值，median表示取中位数。5.2. 使用示例"""

n = 100
y_true = np.random.randint(1, 100, n)
y_pred = np.random.randint(1, 100, n)

median_absolute_error(y_true, y_pred)
"""median_absolute_error就是scikit-learn中用来计算MedAE的函数。

6. 最大误差
最大误差（Max Error），它用于衡量模型预测值与真实值之间的最大差异，揭示模型在最坏情况下的表现。
如果模型在大多数情况下的预测误差都很小，但最大误差很大，那么这可能意味着模型对于某些特定情况的处理不够好，需要进一步优化。

6.1. 计算公式
Max Error(y,^y)=max(|yi−^yi|)其中，yi是真实值，^yi是预测值，max表示取最大值。

6.2. 使用示例"""

n = 100
y_true = np.random.randint(1, 100, n)
y_pred = np.random.randint(1, 100, n)

max_error(y_true, y_pred)
"""max_error就是scikit-learn中用来计算Max Error的函数。

7. 总结
本篇主要介绍了6种常用的误差分析函数，包括：

平均绝对误差
均方误差
均方对数误差
平均绝对百分比误差
绝对误差中值
最大误差
误差的计算方式其实也不算不复杂，不过，掌握scikit-learn中封装好的各种误差计算函数，
还是可以帮助我们在评估回归模型时节约不少时间。"""